//
// Created by luosong on 15/8/28.
// Copyright (c) 2015 CHANJET. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "CSPIdentityModel.h"

@class CSPTask;
@class CSPRequestConfig;

/**
*   用户身份的额外信息，比如用户的姓名，头像URL，联系方式等等。
*/
@interface CSPIdentityExtra : CSPModel

/**
*   CSP系统为用户分配的ID，userId在整个CSP系统都是唯一的。
*/
@property (nonatomic, strong, readwrite) NSString *userId;

/**
*   用户的姓名，不同的用户姓名是可以相同的。
*/
@property (nonatomic, strong, readwrite) NSString *name;

/**
*   用户的昵称，目前用户昵称在整个CSP平台是要求唯一的。
*/
@property (nonatomic, strong, readwrite) NSString *nickName;

/**
*   用户的邮件地址，这个邮件地址仅仅是用户填写的一个联系方式。
*   并非用户绑定邮箱。
*/
@property (nonatomic, strong, readwrite) NSString *email;

/**
*   用户的手机号码，这个手机号码仅仅是用户填写的一个联系方式。
*   并非用户绑定手机号。
*/
@property (nonatomic, strong, readwrite) NSString *mobile;

/**
*   用户性别。
*/
@property (nonatomic, assign, readwrite) int sex;

/**
*   用户的头像URL地址。
*/
@property (nonatomic, strong, readwrite) NSString *headPicture;

/**
*   用户是否来自第三方平台登录的，比如微信、QQ、微博等。
*/
@property (nonatomic, assign, readwrite) BOOL isThirdPlatformUser;

@end


/**
*   CSPIdentityStore
*/
@interface CSPIdentityStore : CSPModel

/**
*  Access Key component of credentials.
*/
@property (nonatomic, strong, readonly) NSString *accessKey;

/**
*  Secret Access Key component of credentials.
*/
@property (nonatomic, strong, readonly) NSString *secretKey;

/**
*  Session Token component of credentials.
*/
@property (nonatomic, strong, readonly) NSString *sessionKey;

/**
*  Date at which these credentials will expire.
*/
@property (nonatomic, strong, readonly) NSDate *expiration;

/**
*  Date at which these credentials will expire.
*/
@property (nonatomic, strong, readonly) CSPIdentityExtra *extra;

- (void)clearKeychain;

- (void)clearCredentials;
@end

/**
*   CSPIdentityService
*/
@interface CSPIdentityService : NSObject

/**
The service configuration used to instantiate this service client.

@warning Once the client is instantiated, do not modify the configuration object. It may cause unspecified behaviors.
*/
@property (nonatomic, strong, readonly) CSPRequestConfig *configuration;

/**
* 返回用户登录成功后的身份信息。
*/
@property (nonatomic, strong, readonly) CSPIdentityStore *identityStore;


/**

申请给你的手机号码发送一个含有注册验证码的短信。
申请给你的手机号码发送一个含有注册验证码的短信。
注意：CSP平台对同一个IP地址和同一个手机号码发送短信是有一些约束条件的。
因此，请不要使用这个接口频繁进行短信发送申请。否则将可能导致你app的短信发送能力受到限制。

@param request 要申请注册的账号类型和账号

@return 返回一个 'CSPTask' 的实例。如果成功返回，则 'task.result' 会是 'nil'。如果失败，则 'task.error' 会包含一个 'NSError' 对象，在这个NSError中，error domain 的值是 'CSPIdentityErrorDomain'，error code 的值是 ''CSPIdentityErrorInvalidParameter'、'CSPIdentityErrorInternalError'或者 'CSPIdentitySignupAccountExists'
 */
- (CSPTask *)applySignupCode:(CSPIdentityApplySignupCodeRequest *)request;

/**
* 使用账号和密码登录 CSP 系统，获取授权认证的身份。CSP 平台永远不会在云端以明文的方式保留用户的账号密码。账号密码会通过安全的 https 通道传输到云端并且进行散列处理后保存。
* @param request 申请登录的账号信息，包含用户账号和用户密码。
* @return
* <p>返回一个 'CSPTask' 的实例。如果成功返回，则 'task.result' 会是 'CSPIdentityStore' 实例。</p>
* <p>如果失败，则 'task.error' 会包含一个 'NSError' 对象，在这个 error 中，error domain 的值是 'CSPIdentityErrorDomain'， code 的值会是 '' 之一。</p>
*/
- (CSPTask *)loginWithAccountPassword:(CSPIdentityLoginWithAccountRequest *)request;

/**
*   注销账号登录状态。注销账号后，存储的 'CSPIdentityStore' 信息将会被全部清空。用户在下次需要访问应用时，需要重新登录。
*
*   @return 返回一个 'CSPTask' 的实例，如果注销账号成功返回，则 'task.result' 会是 nil。
*/
- (CSPTask *)logout;

/**
* 刷新获取的Token，不需要传入任何参数。CSPIdentityService 会自动从 KeyChainStore 中获取 sessionToken 进行刷新。
* 刷新成功返回的 CSPTask.result 会是 nil。如果失败则 ’task.error' 会包含一个 'NSError'，error code 的值可能是：
* <p>'CSPIdentityErrorMissingAuthenticationToken' 表示在缓存中没有经过验证的授权信息。你需要注册或者登录。</p>
* <p>'CSPIdentityErrorInvalidClientTokenId' 表示缓存中的 token 已经失效</p>
*/
- (CSPTask *)refreshToken;

@end